import { createRouter, createWebHistory } from 'vue-router'
import type { RouteRecordRaw } from 'vue-router'

/**
 * 动态导入所有页面组件
 * 匹配 /src/views 目录下所有的 index.vue 文件
 */
const pageFiles = import.meta.glob('/src/views/**/index.vue')

/**
 * 动态导入所有页面元数据
 * 匹配 /src/views 目录下所有的 page.ts 文件，并立即加载
 */
const metaFiles = import.meta.glob('/src/views/**/page.ts', { eager: true }) as Record<string, { default: any }>

/**
 * 自动生成完整路由配置（含父子路由）
 * 遍历所有页面文件并根据目录结构生成路由配置，包括父子路由关系
 * @returns 路由配置数组
 */
function createRoutes(): RouteRecordRaw[] {
    const routes: RouteRecordRaw[] = []

    // 工具函数：标准化路径（定义在内部，不暴露）
    const normalizePath = (p: string): string =>
        p.replace(/^\/src\/views/, '').replace(/\/index\.vue$/, '') || '/'

    // 遍历所有页面文件，为主路由生成配置
    for (const [absPath, component] of Object.entries(pageFiles)) {
        // 跳过子路由文件（位于 children 目录下）
        if (absPath.includes('/children/')) continue

        const routePath = normalizePath(absPath)
        const dir = absPath.replace(/\/index\.vue$/, '')
        const meta = metaFiles[`${dir}/page.ts`]?.default || {}

        // 构建子路由
        const children: RouteRecordRaw[] = []
        // 遍历所有页面文件，为当前主路由查找子路由
        for (const [childAbsPath, childComponent] of Object.entries(pageFiles)) {
            // 检查是否为当前路由的子路由（路径以当前目录下的 children 开头）
            if (childAbsPath.startsWith(`${dir}/children/`)) {
                // 提取子路由名称（移除路径前缀和文件名）
                const childName = childAbsPath
                    .replace(`${dir}/children/`, '')
                    .replace(/\/index\.vue$/, '')
                // 获取子路由元数据
                const childMeta = metaFiles[`${childAbsPath.replace(/\/index\.vue$/, '')}/page.ts`]?.default || {}
                // 添加子路由配置
                children.push({ path: childName, component: childComponent, meta: childMeta })
            }
        }

        // 生成路由名称（根路径为 index，其他路径移除开头的 / 并将 / 替换为 -）
        const name = routePath === '/' ? 'index' : routePath.slice(1).replace(/\//g, '-')
        // 构建路由对象
        const route: RouteRecordRaw = { path: routePath, name, component, meta, children }
        // 如果元数据中包含重定向配置，则添加到路由中
        if (typeof meta.redirect === 'string') route.redirect = meta.redirect

        routes.push(route)
    }

    return routes
}

/**
 * 创建并导出 Vue Router 实例
 * 使用 HTML5 History 模式并应用生成的路由配置
 */
export default createRouter({
    history: createWebHistory(),
    routes: createRoutes()
})